package com.fancy.projecty.B_流程实例;

import com.sun.deploy.panel.ITreeNode;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.lang.model.SourceVersion;
import java.util.List;


/**
 * 查询流程
 * 流程实例中的每个用户将来在自定操作之前需要查询一下,他自己是否有任务需要执行,
 * 比如说 填写请假单是张三去做的, 张三在进入到系统之后,就能查看自己是否有任务去执行,
 * 或者说是 当部门经理去执行任务的时候,首先部门经理也要先去查询,看看自己是否有任务,
 * 当部门经理自己有任务的时候,就需要去执行这个任务了.
 * 所以应该分两个步骤来去看的
 * 1. 先做任务的查询
 * 2.做任务的处理
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class C_查询流程实例 {
	@Autowired
	/*管理流程定义,部署相关的Service*/
	private RepositoryService repositoryService;
	@Autowired
	/*执行管理、包括启动、推进、删除流程实例等操作*/
	private RuntimeService runtimeService;
	@Autowired
	/*任务管理,可以做任务的查询的*/
	private TaskService taskService;





	@Test
	public void c_3王五查询自己的任务() {
		Task task = this.taskService.createTaskQuery()
				.processDefinitionKey("holiday")
				.taskAssignee("wangwu")
				.singleResult();
		// 如果查询任务为空的话,task 就为null
		if (task == null) {
			System.err.println("当前用户没有任务");
		} else {
			// 李四执行完了自己的任务之后, 王五就可以查看到自己的任务了
			System.out.println("流程实例ID:" + task.getProcessInstanceId()); //5001
			System.out.println("任务ID:" + task.getId());  //10002
			System.out.println("任务负责人:" + task.getAssignee()); //wangwu
			System.out.println("任务名称:" + task.getName()); //总经理审批
		}
	}

	@Test
	public void c_2查询李四的任务() {
		//获取一个任务
		Task task = this.taskService.createTaskQuery()
				.processDefinitionKey("holiday")
				.taskAssignee("lisi")
				.singleResult();
		// 如果执行了	this.taskService.complete("7502"); 的话,李四的任务执行完了
		//再查询的时候就查询不出来任务了,所以Task就为null 了.

		if (task == null) {
			System.err.println("李四没有任务");
		} else {
			System.out.println("流程实例ID:" + task.getProcessInstanceId());    // 流程实例ID:5001
			System.out.println("任务ID:" + task.getId());      // 任务ID:7502
			System.out.println("任务负责人:" + task.getAssignee());    // 任务负责人:lisi
			System.out.println("任务名称:" + task.getName());    // 任务名称:部门经理审批
		}

	}



	@Test
	public void c_1查询张三的任务() {
		//3.根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
		List<Task> list = this.taskService

				.createTaskQuery()
				//流程定义的key
				.processDefinitionKey("qingjia01")
				//任务将来的执行者
				.taskAssignee("46")
				//获取任务集合,
				.list();

		if (list != null && list.size() != 0) {
			System.err.println("张三的任务列表");
			//4.任务列表的展示
			for (Task task : list) {
				System.out.println("流程实例ID:" + task.getProcessInstanceId()); //5001
				System.out.println("任务ID:" + task.getId());  //5004
				System.out.println("任务负责人:" + task.getAssignee()); //zhangsan
				System.out.println("任务名称:" + task.getName()); //填写请假申请单
			}
		} else {
			System.err.println("张三没有任务");
		}
	}


}
